#!/bin/sh
########################################################################
# Begin $rc_base/init.d/dnsmasq
#
# Description : dnsmasq init script
#
# Authors     : Michael Tremer - mitch@ipfire.org
#
# Version     : 01.00
#
# Notes       :
#
########################################################################

. /etc/sysconfig/rc
. ${rc_functions}

CACHE_SIZE=2500
ENABLE_DNSSEC=1
SHOW_SRV=1
TRUST_ANCHOR=".,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5"
TIMESTAMP_FILE="/var/ipfire/dns/dnssec-timestamp"

# Pull custom configuration file
if [ -e "/etc/sysconfig/dnsmasq" ]; then
	. /etc/sysconfig/dnsmasq
fi

function dnssec_args() {
	local cmdline="--dnssec --dnssec-timestamp ${TIMESTAMP_FILE}"

	if [ -n "${TRUST_ANCHOR}" ]; then
		cmdline="${cmdline} --trust-anchor=${TRUST_ANCHOR}"
	fi

	echo "${cmdline}"
}

function dns_forward_args() {
	local file="${1}"

	# Do nothing if file is empty.
	[ -s "${file}" ] || return

	local cmdline

	local enabled zone server remark
	while IFS="," read -r enabled zone server remark; do
		# Line must be enabled.
		[ "${enabled}" = "on" ] || continue

		cmdline="${cmdline} --server=/${zone}/${server}"
	done < ${file}

	echo "${cmdline}"
}

function dns_leases_args() {
	eval $(/usr/local/bin/readhash /var/ipfire/dhcp/settings)

	# If the DHCP server is enabled and DNS Update (RFC2136) is
	# enabled, too, we won't overlay the internal domain with
	# the dynamic/static leases.

	if ([ "${ENABLE_GREEN}" = "on" ] || [ "${ENABLE_BLUE}" = "on" ]) \
			&& [ "${DNS_UPDATE_ENABLED}" = "on" ]; then
		return
	fi

	echo "-l /var/state/dhcp/dhcpd.leases"
}

case "${1}" in
	start)
		# kill already running copy of dnsmasq...
		killproc /usr/sbin/dnsmasq 2>&1 > /dev/null

		boot_mesg "Starting Domain Name Service Proxy..."
		
		eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings)
		ARGS="$CUSTOM_ARGS"
		[ "$DOMAIN_NAME_GREEN" != "" ] && ARGS="$ARGS -s $DOMAIN_NAME_GREEN"

		# DHCP configuration
		ARGS="${ARGS} $(dns_leases_args)"

		echo > /var/ipfire/red/resolv.conf # Clear it
		if [ -e "/var/ipfire/red/dns1" ]; then
		    DNS1=$(cat /var/ipfire/red/dns1 2>/dev/null)
		    if [ ! -z ${DNS1} ]; then
			echo "nameserver ${DNS1}" >> /var/ipfire/red/resolv.conf
		    fi
		fi
		if [ -e "/var/ipfire/red/dns2" ]; then
		    DNS2=$(cat /var/ipfire/red/dns2 2>/dev/null)
		    if [ ! -z ${DNS2} ]; then
			echo "nameserver ${DNS2}" >> /var/ipfire/red/resolv.conf
		    fi
		fi
		[ -e "/var/ipfire/red/active" ] && ARGS="$ARGS -r /var/ipfire/red/resolv.conf"
	
		ARGS="$ARGS --domain=`cat /var/ipfire/main/settings |grep DOMAIN |cut -d = -f 2`"

		# Add custom forward dns zones.
		ARGS="${ARGS} $(dns_forward_args /var/ipfire/dnsforward/config)"

		# Enabled DNSSEC validation
		if [ "${ENABLE_DNSSEC}" -eq 1 ]; then
			ARGS="${ARGS} $(dnssec_args)"
		fi

		if [ -n "${CACHE_SIZE}" ]; then
			ARGS="${ARGS} --cache-size=${CACHE_SIZE}"
		fi

		loadproc /usr/sbin/dnsmasq ${ARGS}
		
		if [ "${SHOW_SRV}" -eq 1 ] && [ "${DNS1}" != "" -o "${DNS2}" != "" ]; then
		    boot_mesg "Using DNS server(s): ${DNS1} ${DNS2}"
		    boot_mesg_flush
		fi
		;;

	stop)
		boot_mesg "Stopping Domain Name Service Proxy..."
		killproc /usr/sbin/dnsmasq
		;;

	restart)
		${0} stop
		sleep 1
		${0} start
		;;

	status)
		statusproc /usr/sbin/dnsmasq
		;;

	*)
		echo "Usage: ${0} {start|stop|restart|status}"
		exit 1
		;;
esac

# End $rc_base/init.d/dnsmasq
